/**
 * @file 全局工具方法
 *
 * @author liubin29(liubin29@baidu.com)
 * 2016年4月14日
 */


/**
 * 格式化时间
 *
 * @param {Object} date 日期对象
 * @param {string} fmt 格式
 * @return {string} value
 */
export function formatDate(date, fmt) {
    var o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(), // 日
        'h+': date.getHours(), // 小时
        'm+': date.getMinutes(), // 分
        's+': date.getSeconds(), // 秒
        'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
        'S': date.getMilliseconds() // 毫秒
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    for (var k in o) {
        if (new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
        }
    }
    return fmt;
}

export function formatStartDate(date, fmt) {
    date.setHours(0);
    date.setMinutes(0);
    date.setSeconds(0);
    return formatDate(date, 'yyyy-MM-dd hh:mm:ss');
}

export function formatEndDate(date, fmt) {
    date.setHours(23);
    date.setMinutes(59);
    date.setSeconds(59);

    return formatDate(date, 'yyyy-MM-dd hh:mm:ss');
}

export function loadJS(url, callback) {
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    // script.type = 'text/javascript';
    // script.charset = 'utf-8';
    // script.async = true;
    script.callback = false;

    script.onreadystatechange = function () {
        if (this.readyState === 'complete' && !script.callback) {
            script.callback = true;
            callback();
        }
    };
    script.onload = function () {
        if (!script.callback) {
            script.callback = true;
            callback();
        }
    };

    script.src = url;
    head.appendChild(script);
}

// 判断是否相同，包括数组和object
export function isEqual(x, y) {
    if (x === y) {
        return true;
    }

    if (!(x instanceof Object) || !(y instanceof Object)) {
        return false;
    }

    if (x.constructor !== y.constructor) {
        return false;
    }
    for (var p in x) {
        if (x.hasOwnProperty(p)) {
            if (!y.hasOwnProperty(p)) {
                return false;
            }

            if (x[p] === y[p]) {
                continue;
            }

            if (typeof x[p] !== 'object') {
                return false;
            }

            if (!isEqual(x[p], y[p])) {
                return false;
            }
        }
    }

    for (p in y) {
        if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) {
            return false;
        }
    }
    return true;
}

/**
 * 获取问号后面参数信息
 *
 * @param {string} url 路由地址
 * @return {Object} query对象
 */
export function parseQuery(url) {
    url = url ? url : window.location.href;
    let regUrl = /^[^\?]+\?([\w\W]+)$/;
    let regPara = /([^&=]+)=([\w\W]*?)(&|$|#)/g;
    let arrUrl = regUrl.exec(url);
    let ret = {};
    if (arrUrl && arrUrl[1]) {
        let strPara = arrUrl[1];
        let result;
        while ((result = regPara.exec(strPara)) != null) {
            ret[result[1]] = result[2];
        }
    }
    return ret;
}

export let cookie = {

    /**
     * 设置cookie
     *
     * @param  {string} name 文本信息
     * @param  {string} value 文本信息
     * @param  {Object} options 文本信息
     */
    set(name, value, options) {
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires === 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires === 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            }
            else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString();
        }
        var path = options.path ? '; path=' + options.path : '';
        var domain = options.domain ? '; domain=' + options.domain : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    },

    /**
     * 获取cookie
     *
     * @param  {string} name 文本信息
     * @return {string} cookie的值
     */
    get(name) {
        var arr;
        var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)');
        arr = document.cookie.match(reg);
        if (arr) {
            return window.decodeURI(arr[2]);
        }
        return '';
    },

    /**
     * 删除cookie
     *
     * @param {string} [name] [待删除cookie名称]
     */
    del(name) {
        var exp = new Date();
        exp.setTime(exp.getTime() - 1);
        var cval = this.get(name);
        if (cval) {
            document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString();
        }
    }
};
